/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
  //哑节点（方便返回结果） 当前结果链表的指针 进位
  let dummy = new ListNode(0)
  let current = dummy
  let carry = 0

  // 当 l1 或 l2 还有值，或进位不为 0 时，继续循环
  while (l1 !== null || l2 !== null || carry !== 0) {
    const val1 = l1 ? l1.val : 0
    const val2 = l2 ? l2.val : 0
    const sum = val1 + val2 + carry

    //更新进位 
    carry = Math.floor(sum / 10)
    //current.next存储当前位 current后移一位
    current.next = new ListNode(sum % 10)
    current = current.next

    //移动到下一个节点
    if (l1) l1 = l1.next
    if (l2) l2 = l2.next
  }

  //返回哑节点的后一个节点（真正的头节点）
  return dummy.next
};